//
// Created by Administrator on 2022/10/17.
//

#ifndef ONIX_INTERRUPT_H
#define ONIX_INTERRUPT_H

#include <onix/types.h>

#define IDT_SIZE    256

#define IRQ_CLOCK       0
#define IRQ_KEYBOARD    1
#define IRQ_CASCADE     2
#define IRQ_SERIAL_2    3
#define IRQ_SERIAL_1    4
#define IRQ_PARALLEL_2  5
#define IRQ_FLOPPY      6
#define IRQ_PARALLEL_1  7
#define IRQ_RTC         8
#define IRQ_REDIRECT    9
#define IRQ_MOUSE       12
#define IRQ_MATH        13
#define IRQ_HARD_DISK   14
#define IRQ_HARD_DISK2  15

#define IRQ_MASTER_NR   0x20
#define IRQ_SLAVE_NR    0x28

typedef struct gate_t
{
    u16 offset0;    // 段内偏移 0 ~ 15 位
    u16 selector;   // 代码段选择子
    u8 reserved;    // 保留不用
    u8 type : 4;    // 任务门/中断门/陷阱门
    u8 segment : 1; // segment = 0 表示系统段
    u8 DPL : 2;     // 使用 int 指令访问的最低权限
    u8 present : 1; // 是否有效
    u16 offset1;    // 段内偏移 16 ~ 31 位
} _packed gate_t;

typedef void *handler_t; // 中断处理函数

void idt_init();
void pic_init();
void interrupt_init();
void send_eoi(int vector);
void set_interrupt_handler(u32 irq, handler_t handler);
void set_interrupt_mask(u32 irq, bool enable);

// 清除 IF 位，返回设置之前的值
bool interrupt_disable();
// 获得 IF 位
bool get_interrupt_state();
// 设置 IF 位
void set_interrupt_state(bool state);

// 系统调用初始化
void syscall_init();

// 键盘中断初始化
void keyboard_init();

#endif //ONIX_INTERRUPT_H
